package com.av.acciones.elementocatalogo;

import org.apache.log4j.Logger;

import com.av.acciones.BaseAccion;
import com.av.db.dataobjects.ElementoCatalogo;
import com.av.db.dataobjects.enums.Catalogo;
import com.av.db.layer.interfaces.ElementoCatalogoLayer;
import com.av.exceptions.AvException;
import com.av.rmi.Parametro;
import com.av.rmi.Parametro.Tipo;

/**
 * Accion que agrega un elementoCatalogo en la base de datos configurada
 * 
 * @author Emmanuel Alcantara Garces
 * 
 */
public class AgregarAccion extends BaseAccion {
	private static Logger log = Logger.getLogger(AgregarAccion.class);
	private ElementoCatalogoLayer al;

	@Override
	public Parametro ejecutar(Parametro parametro) throws AvException {
		log.info("Inicio - ejecutar(Parametro parametro)");

		al = (ElementoCatalogoLayer) getBean(ElementoCatalogoLayer.BEAN_NAME);
		ElementoCatalogo a = null;
		if (parametro.getValor(Tipo.INPUT) instanceof ElementoCatalogo) {
			a = (ElementoCatalogo) parametro.getValor(Tipo.INPUT);

			// Validacion especial para costo por hora
			if (a.getCatalogo() != null
					&& a.getCatalogo().equals(Catalogo.COSTOHORA)) {
				a = actualizarCostoPorHora(a);
			} else {
				al.agregar(a);
			}

			parametro.setValor(Tipo.OUTPUT, a);
		}

		log.info("Fin - ejecutar(Parametro parametro)");

		return parametro;
	}// ejecutar

	/**
	 * Funcion que busca un elemento del tipo costo por hora y actualiza los
	 * datos del mismo en caso de existir,
	 * 
	 * @param ec
	 * @return
	 * @throws AvException
	 */
	private ElementoCatalogo actualizarCostoPorHora(ElementoCatalogo ec)
			throws AvException {
		log.info("Inicio - actualizarCostoPorHora(ElementoCatalogo ec)");
		log.debug("Costo : " + ec.getCosto());
		log.debug("Descripcion : " + ec.getDescripcion());

		ElementoCatalogo[] ecTemp = al.obtener(Catalogo.COSTOHORA);
		if (ecTemp != null && ecTemp.length > 0) {
			log.debug("Id : " + ecTemp[0].getId());
			ecTemp[0].setCosto(ec.getCosto());
			ecTemp[0].setDescripcion(ec.getDescripcion());
			al.actualizar(ecTemp[0]);
			ec = ecTemp[0];
		} else {
			al.agregar(ec);
		}

		log.info("Fin - actualizarCostoPorHora(ElementoCatalogo ec)");

		return ec;
	}// actualizarCostoPorHora
}// AgregarAccion